package plp.expressions2.expression;

import plp.expressions1.util.Tipo;
import plp.expressions2.memory.AmbienteCompilacao;
import plp.expressions2.memory.AmbienteExecucao;
import plp.expressions2.memory.VariavelJaDeclaradaException;
import plp.expressions2.memory.VariavelNaoDeclaradaException;
import plp.expressions2.util.LinguagemVisitor;
import plp.expressions2.util.VisitorException;
import plp.expressions2.util.Visitor;

/** 
 * Uma expressao &eacute; a unidade basica na Linguagem de Expressoes.
 */
public abstract class Expressao {
	
	protected static LinguagemVisitor visit = new Visitor();
	
	/**
	 * Avalia a expressao retornando seu Valor.
	 */
	public abstract Valor avaliar(AmbienteExecucao amb) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException;

	/**
	 * Realiza a verificacao de tipos desta expressao.
	 *
	 * @param amb o ambiente que contem o mapeamento entre identificadores
	 *          e tipos.
	 * @return <code>true</code> se os tipos da expressao sao validos;
	 *          <code>false</code> caso contrario.
	 * @throws VisitorException 	 
	 */
	public abstract boolean checaTipo(AmbienteCompilacao amb) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, VisitorException;

	/**
	 * Retorna os tipos possiveis desta expressao.
	 *
	 * @param amb o ambiente que contem o mapeamento entre identificadores
	 *          e tipos.
	 * @return os tipos possiveis desta expressao.
	 */
	public abstract Tipo getTipo(AmbienteCompilacao amb) throws VariavelNaoDeclaradaException, VariavelJaDeclaradaException, VisitorException;
	
	/**
	 * 
	 * @param visitor
	 * @throws VisitorException
	 */
	public abstract void accept(LinguagemVisitor lingVisitor, AmbienteCompilacao ambiente) throws VisitorException;
	
	//----------------------------------------------------------------------------------------------------
	//--------------Metodos utilizados na funcionalidade de selecao dos erros no editor ------------------
	protected int line;
	protected int beginColumn;
	protected int endColumn;

	public int getLineExpression() {
		return this.line;
	}

	public int getBeginColumnExpression() {
		return this.beginColumn;
	}

	public int getEndColumnExpression() {
		return this.endColumn;
	}
	//----------------------------------------------------------------------------------------------------

}
